#include <vector>
#include <list>
#include <iterator>
#include <algorithm>
#include <iostream>

using namespace std;

void printVec(vector<int> &);
void printList(list<int> &);

int main()
{
    int a1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int a2[sizeof(a1) / sizeof(*a1)]; // a2 与 a1 大小一样
    // ret 指向拷贝到 a2 的尾元素之后的位置
    auto ret = copy(begin(a1), end(a1), a2); // 把 a1 的内容拷贝给 a2

    list<int> ilst = {0, 1, 2, 3, 0};
    // 将所有值为 0 的元素改为 42
    replace(ilst.begin(), ilst.end(), 0, 42);
    printList(ilst);

    ilst = {0, 1, 2, 3, 0};
    vector<int> ivec = {0, 1, 2, 3, 0};
    // 使用 back_inserter 按需要增长目标序列
    // ilst 未变，ivec 包含 ilst 的一份拷贝，拷贝中的 0 都被替换为 42
    replace_copy(ilst.cbegin(), ilst.cend(),
                back_inserter(ivec), 0, 42);
    printVec(ivec);
}

void printVec(vector<int> &v)
{
    for (int ival : v)
        cout << ival << " ";
    cout << endl;
}

void printList(list<int> &lst)
{
    for (int ival : lst)
        cout << ival << " ";
    cout << endl;
}